package com.molichuxing.services.infrastructure.service;

import com.molichuxing.framework.dto.Paged;
import com.molichuxing.framework.service.RootService;
import com.molichuxing.services.infrastructure.dto.request.create.PaymentCreateDto;
import com.molichuxing.services.infrastructure.dto.request.modify.PaymentModifyDto;
import com.molichuxing.services.infrastructure.dto.response.PaymentDto;
import com.molichuxing.services.property.PaymentCostTypeEnum;
import com.molichuxing.services.property.PaymentStatusEnum;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 支付表
 * </p>
 *
 * @author zhaopenghui
 * @since 2019-08-23
 */
public interface PaymentService extends RootService {

    /**
     * 添加支付信息
     *
     * @param paymentCreateDto
     * @return
     * @throws Exception
     */
    Integer createPayment(PaymentCreateDto paymentCreateDto) throws Exception;

    /**
     * 支付分页列表
     *
     * @param map      key:businessType Integer 业务类型（1：订阅，2：专属：3：经销商）
     *                 key:orderCode String 订单号
     *                 key:payNumber String 付款流水号
     *                 key:userId Integer 用户id
     *                 key:startPayTime LocalDateTime 付款开始时间
     *                 key:endPayTime LocalDateTime 付款结束时间
     *                 key:payWay Integer 支付方式
     *                 key:payType 支付类型（1：订购，2：加购，3：结算，4：还款）
     * @param pageNum
     * @param pageSize
     * @return
     * @throws Exception
     */
    Paged<PaymentDto> getPaymentPage(Map<String, Object> map, Integer pageNum, Integer pageSize) throws Exception;

    /**
     * 根据订单号，支付状态，支付类型查询支付信息
     *
     * @param orderCode 订单号
     * @param status    支付状态
     * @param payType   支付类型
     * @return
     */
    List<PaymentDto> getListByOrderCode(Long orderCode, Integer status, Integer payType);

    /**
     * 查询支付信息
     *
     * @param userId    用户id
     * @param payStatus 支付状态
     * @return
     */
    List<PaymentDto> getPaymentByUser(Integer userId, PaymentStatusEnum payStatus);

    /**
     * 查询支付信息
     *
     * @param orderCode 订单号
     * @return
     */
    PaymentDto getPaymentByOrder(Long orderCode);

    /**
     * 查询支付信息
     *
     * @param orderCode  订单号
     * @param scheduleId 排期id
     * @return
     */
    PaymentDto getPaymentByOrder(Long orderCode, Integer scheduleId);

    /**
     * 修改支付单信息
     *
     * @param modifyDto
     * @return
     */
    Boolean modify(PaymentModifyDto modifyDto);

    /**
     * 查询支付单信息
     *
     * @param payNumber 付款流水号
     * @return
     */
    PaymentDto getPayment(String payNumber);

    /**
     * 支付完成修改支付单信息
     *
     * @param modifyDto
     * @return
     */
    boolean modifyPayResult(PaymentModifyDto modifyDto);

    /**
     * 查询支付单信息
     *
     * @param orderCode  订单号
     * @param scheduleId 排期id
     * @param costType   费用类型
     * @return
     */
    PaymentDto getPaymentByOrder(Long orderCode, Integer scheduleId, PaymentCostTypeEnum costType);

    /**
     * 通过业务类型查询数量
     *
     * @return
     * @throws Exception
     */
    Map<Integer, Integer> getPaymentCountByBusinessType() throws Exception;

    /**
     * 查询支付成功信息
     *
     * @param selectParams
     * @return
     */
    List<PaymentDto> getPaymentSuccessList(Map<String, Object> selectParams);

    /**
     * 查询支付成功信息条数
     *
     * @param selectParams
     * @return
     */
    Long getPaymentSuccessListCount(Map<String, Object> selectParams);

    /**
     * 查询支付成功信息
     *
     * @param orderCode 订单号
     * @param costType  支付类型
     * @return
     */
    List<PaymentDto> getSuccessPayment(Long orderCode, PaymentCostTypeEnum costType);

    /**
     * 线下支付修改支付信息
     *
     * @param modifyDto
     * @return
     */
    boolean modifyOffline(PaymentModifyDto modifyDto);
}
